package com.cictec.middleware.gps.engine.position;

import java.util.Date;

import javax.annotation.PostConstruct;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.alibaba.fastjson.JSON;
import com.cictec.middleware.commons.utils.PMSUtils;
import com.cictec.middleware.gps.engine.BusInstance;
import com.cictec.middleware.gps.engine.TimeEventBus;
import com.cictec.middleware.gps.engine.event.BusLineChangeEvent;
import com.cictec.middleware.gps.engine.exception.BusPositionHandlerException;
import com.google.common.eventbus.Subscribe;

/**
 * gps数据处理流程
 * 
 * @author Zhibin
 *
 */
@Repository
public class PositionHandlerEventListener extends BusPositionHandlerService{

	private static Logger logger = LoggerFactory.getLogger(PositionHandlerEventListener.class);
	@Autowired
	private TimeEventBus timeEventBus;
	


	@PostConstruct
	public void init() {
		timeEventBus.register(this);
	}

	@Subscribe
	public void onTerminalPosition(PositionHandlerEvent event) {

		BusInstance busInstance = event.getBusInstance();

		try {
			busPositionHandler(busInstance);
		} catch (Exception e) {
			e.printStackTrace();
			logger.error("busInstance:{}  exception :{}", JSON.toJSONString(busInstance.getAttributes()), e);
		}
	}

	public void busPositionHandler(BusInstance busInstance) throws BusPositionHandlerException {

		// 第一步：漂移判断处理
 		busPositionDriftHandler.onHandler(busInstance);
		if(busInstance.isInDrift()){
			return;
		}
		
		// 校验车辆所在线路
		if (PMSUtils.isEmpty(busInstance.getBus().getBusWorkingLineUuid())
				|| !busInstance.getBus().getBusWorkingLineUuid().equals(busInstance.getLineUuid())) {
			// 更新车辆当前跑的线路
			timeEventBus.post(new BusLineChangeEvent(new Date(), busInstance.getBus().getBusUuid(), busInstance.getBus().getBusWorkingLineUuid(), busInstance.getLineUuid()));
		}

		if(busInstance.isEnterOut()){
			busInstance.setCurrentStation(busInstance);
		}
		
		// 司机签到信息处理
		busPositionDriverHandler.onHandler(busInstance);
		
		// 第二步：运营状态判断处理
		busPositionOperationHandler.onHandler(busInstance);

		// 第三步 待发区判断（车辆处于运营状态，进行）
		busPositionStandbyHandler.onHandler(busInstance);

		// 第四步 方向判断 根据坐标点判断线路方向（待发区判断完毕！ ）
		busPositionLineTypeHandler.onHandler(busInstance);

		// 第五步 偏线判断（存在线路上下行 ）
		busPositionDeviateHandler.onHandler(busInstance);

		// 第六步 相对位置和进出站判断、当前站点信息、下一站
		// 第六步 进出站信息
		busPositionStationHandler.onHandler(busInstance);
		// 第六步 相对距离
		busPositionRelativeDistanceHandler.onHandler(busInstance);
		// 第六步 班次、趟次计算
		busPositionShiftAndTripHandler.onHandler(busInstance);

		// 报警信息
		busPositionAlarmsHandler.onHandler(busInstance);

		// 处理车间距问题，包括车辆过近，过远，车辆叠加状态等
		// BusPositionDistanceHandler.onHandler(busInstance);

		// 位置信息存储到redis、站点es ，并发送数据到 apolo
		// 分析数据通用推送
		busPositionDistributeHandler.onHandler(busInstance);
		
		busPositionLogHandler.showPostionLog(busInstance);

	}

}
